package com.scott.ch170;

import com.scott.ch170.entity.Baby;
import com.scott.ch170.entity.Child;
import com.scott.ch170.entity.Parent;

import java.util.Comparator;
import java.util.TreeSet;

/**
 * @author 黄后林
 * @version 1.0
 * @note
 * @date 2021-12-18 23:12:54
 */
public class Client {

    public static void main(String[] args) {

        // 按年龄排序
        System.out.println("------------按年龄排序------------");
        c01();
        System.out.println();

        System.out.println("------------按名字排序------------");
        // 按名字排序
        c02();

        System.out.println("------------不能按工资排序------------");

        // 按名字排序
        c03();

    }

    public static void c03(){
//        下面这些代码打开会报错哦 下限通配符 只能传Child或者Child的父类 不能是Child的子类
//        因为创建Child的时候 子类Baby的属性并没有被初始化  所以不可以传子类
//        TreeSet<Child> childTreeSet=new TreeSet<>(new ComparatorBaby());
//        childTreeSet.add(new Child("scott",30));
//        childTreeSet.add(new Child("frank",20));
//        childTreeSet.add(new Child("kitty",40));
//        childTreeSet.add(new Child("nachos",50));
//
//        for (Child child : childTreeSet) {
//            System.out.println(child);
//        }
    }

    public static void c02(){
        // 下限通配符 Child或者Child的父类 按名字排序  因为创建Child的时候 父类的属性已经被初始化  所以可以传父类
        TreeSet<Child> childTreeSet=new TreeSet<>(new ComparatorParent());
        childTreeSet.add(new Child("scott",30));
        childTreeSet.add(new Child("frank",20));
        childTreeSet.add(new Child("kitty",40));
        childTreeSet.add(new Child("nachos",50));

        for (Child child : childTreeSet) {
            System.out.println(child);
        }
    }

    public static void c01(){
        // 下限通配符 Child或者Child的父类 按年龄排序
        TreeSet<Child> childTreeSet=new TreeSet<>(new ComparatorChild());
        childTreeSet.add(new Child("scott",30));
        childTreeSet.add(new Child("frank",20));
        childTreeSet.add(new Child("kitty",40));
        childTreeSet.add(new Child("nachos",50));

        for (Child child : childTreeSet) {
            System.out.println(child);
        }
    }
}

// 姓名比较器
class ComparatorParent implements Comparator<Parent> {

    @Override
    public int compare(Parent p1, Parent p2) {
        return p1.getName().compareTo(p2.getName());
    }
}

// 年龄比较器
class ComparatorChild implements Comparator<Child> {

    @Override
    public int compare(Child c1, Child c2) {
        return c1.getAge()-c2.getAge();
    }
}

// 工资比较器
class ComparatorBaby implements Comparator<Baby> {

    @Override
    public int compare(Baby b1, Baby b2) {
        return b1.getMoney()-b2.getMoney();

    }
}


